package process

import (
	"encoding/json"
	"errors"
	"fmt"
	"go_chat_system/client/utils"
	"go_chat_system/common"
	"net"
	"os"
)

//创建安全的协程
func createSafeGo(call func(net.Conn), conn net.Conn, errCall func(err interface{})) {
	go func() {
		defer func(errCall func(err interface{})) {
			if err := recover(); err != nil {
				fmt.Printf("recover error: %v\n", err)
				if errCall != nil {
					errCall(err)
				}
			}
		}(errCall)

		call(conn)
	}()
}

// 显示登陆成功的页面
func showHomeMenu() {
	var input int
	smsProcess := &SmsProcess{}
	fmt.Println("------------------------ 用户页面 ------------------------")
	fmt.Println("\t\t\t 1 显示在线用户列表")
	fmt.Println("\t\t\t 2 发送信息")
	fmt.Println("\t\t\t 3 信息列表")
	fmt.Println("\t\t\t 4 退出系统")
	fmt.Printf("请输入(1-4):")
	fmt.Scanln(&input)

	switch input {
	case 1:
		outputOnlineUser()
	case 2:
		showGroupMessage(smsProcess)
	case 3:
		outputCurrentUser()
	case 4:
		//待优化：退出系统，给服务器发送退出信息，然后再退出
		fmt.Println("退出")
		os.Exit(0)
	default:
		fmt.Println("输入有误！")
	}
}

// 保持与服务器的通讯
func processServerMessage(conn net.Conn) {
	// 实时监听服务器的推送
	transfer := &utils.Transfer{
		Conn: conn,
	}
	for {
		// 读取服务器的推送
		mess, err := transfer.ReadData()
		if err != nil {
			fmt.Println("Process Server Message Error:", err)
			return
		}
		//fmt.Printf("[接收到服务器的推送:%s]\n", mess.Data)
		switch mess.Type {
		case common.NotifyUserStatusMessageType: // 有人上线了
			err = addOnlineUser(mess.Data)
		case common.SmsMessageReply: // 群聊消息
			err = outputGroupMessage(mess.Data)
		default:
			fmt.Println("!!![未知响应：", mess.Type, ", 未知数据：", mess.Data, "]!!!")
		}
		if err != nil {
			fmt.Println("[ERROR]错误提示：", err)
		}
	}
}

// 反序列化并更新在线用户
func addOnlineUser(data string) (err error) {
	var statusMes *common.NotifyUserStatusMessage
	err = json.Unmarshal([]byte(data), &statusMes)
	if err != nil {
		err = errors.New("addOnlineUser Unmarshal")
		return
	}

	updateUserStatus(statusMes)
	return
}
